home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
c
/
idif_10b
/
source
/
diffcomp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-01-21
|
9KB
|
395 lines
/*Includes standard*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*Dclaration des fonctions*/
void howto(void);
int main(int,char **);
int diff(char *,char *);
int reduct(char *);
int crcheck(char *);
void umsg(char *,char *);
/*Dclaration des fonctions externes*/
extern int crc16file(char *name);
/*Quelques constantes fort utiles*/
#define OK 0
#define ERROR (-1)
#define FALSE 0
#define TRUE 1
/*Dclaration des variables*/
FILE *logf;
char str[255];
char str2[255];
char domain[50];
char misc[150];
char nnod[255];
int zone=0;
int region=0;
int net=0;
int hub=0;
/*Dclaration des variables externes*/
extern unsigned int fcrc;
/*Fonction principale*/
int main(int argc,char **argv)
{
int err;
/*Affichage des infos*/
printf("InterDiff v1.00 Beta 1\n(c) 1995, Nicolas LONG\n");
printf("Ce logiciel est diffus selon les termes de la license publique GNU.\n");
printf("Il est ddi aux utilisateurs d'Intermde BBS.\n");
printf("Merci Philippe Orand pour son aide prcieuse !\n---\n\n");
logf=fopen("INTERDIF.LOG","a");
fprintf(logf,"---\n");
/*Si il y a plus de 1 token dans la ligne de cmd*/
if(argc>1)
{
if(!strcmp(*(argv+1),"-diff") && *(argv+2)!=NULL && *(argv+3)!=NULL)
{
umsg("Commande","-diff");
err=diff(*(argv+2),*(argv+3)); /*On applique le diff*/
fclose(logf);
return(err);
}
if(!strcmp(*(argv+1),"-ver") && *(argv+2)!=NULL)
{
umsg("Commande","-ver");
err=crcheck(*(argv+2)); /*On vrifie le CRC16*/
fclose(logf);
return(err);
}
/*Rduction de nodelist*/
if(!strcmp(*(argv+1),"-red") && *(argv+2)!=NULL)
{
umsg("Commande","-red");
/*Vrification des paramtres*/
if(!strcmp(*(argv+2),"-z") && *(argv+3)!=NULL)
sscanf(*(argv+3),"%d",&zone);
/*Si la zone est cohrente*/
if(zone>0 && *(argv+4)!=NULL)
{
/*Si une rgion est spcifie*/
if(!strcmp(*(argv+4),"-r") && *(argv+5)!=NULL)
sscanf(*(argv+5),"%d",®ion);
/*Sinon rduction en nodelist de zone*/
else if(*(argv+4)[0]!='-')
{
err=reduct(*(argv+4));
fclose(logf);
return(err);
}
}
if((region>0 || net>0) && *(argv+6)!=NULL)
{
/*Rduction en nodelist de rgion*/
if(*(argv+6)[0]!='-')
{
err=reduct(*(argv+6));
fclose(logf);
return(err);
}
}
}
/*Affiche le mode d'emploi en cas de mauvais format des paramtres*/
howto();
fclose(logf);
return(ERROR);
}
/*Affichage du mode d'emploi*/
else
{
howto();
fclose(logf);
return(ERROR);
}
}
int diff(char *dif,char *oldnod)
{
/*Dclaration des variables locales*/
FILE *df;
FILE *of;
FILE *nf;
int i,j,cnt,ver;
char c;
if((df=fopen(dif,"rb"))==NULL) /*Ouverture du fichier diff*/
{
umsg("Erreur l'ouverture de la nodediff:",strerror(errno));
return ERROR;
}
if((of=fopen(oldnod,"rb"))==NULL) /*Ouverture de la vieille nodelist*/
{
umsg("Erreur l'ouverture de la nodelist :",strerror(errno));
return ERROR;
}
strcpy(str,dif); /*Recherche du numro de version du diff*/
for(i=strlen(str)-1;str[i]!='.' && i>=0;i--);
str[i+4]=0;
sscanf(&(str[i+1]),"%d",&ver);
strcpy(str,oldnod); /*Gnration du chemin d'accs la nouvelle nodelist*/
for(i=strlen(str)-1;str[i]!='.' && i>=0;i--);
str[i+1]=0;
sprintf(nnod,"%s%03d",str,ver);
if((nf=fopen(nnod,"wb"))==NULL) /*Ouverture de la nouvelle nodelist*/
{
umsg("Erreur l'ouverture de la nodelist:",strerror(errno));
return ERROR;
}
fgets(str,255,df); /*Lecture des lignes de controle*/
fgets(str2,255,of);
fseek(of,0,SEEK_SET);
if(strcmp(str,str2)) /*Controle*/
{
umsg("Nodediff et Nodelist ne se correspondent pas","");
return(ERROR);
}
umsg("Gnration de la nodelist:",nnod);
printf("Veuillez patienter...\n");
while(fgets(str,255,df)!=NULL)
{
if(str[0]=='A') /*Ajout de lignes*/
{
sscanf(str+1,"%d",&cnt);
for(j=0;j<cnt;j++)
{
fgets(str,255,df);
fputs(str,nf);
}
}
else if(str[0]=='D') /*Effacement de lignes*/
{
sscanf(str+1,"%d",&cnt);
for(j=0;j<cnt;j++)
{
fgets(str,255,of);
}
}
else if(str[0]=='C') /*Copie de lignes*/
{
sscanf(str+1,"%d",&cnt);
for(j=0;j<cnt;j++)
{
fgets(str,255,of);
fputs(str,nf);
}
}
}
c=26;
fwrite(&c,1,1,nf);
fclose(of); /*Fermeture des fichiers*/
fclose(df);
fclose(nf);
umsg("Nouvelle Nodelist gnre avec succs","");
return OK;
}
/*Rduction de nodelist*/
int reduct(char *nodel)
{
/*Dclaration des variables locales*/
FILE *nf;
FILE *rf;
char *cpt;
char *cpt2;
char *ex;
char c;
int i,ver;
int fpos,fpos2;
if((nf=fopen(nodel,"rb"))==NULL) /*Ouverture de la nodelist*/
{
umsg("Erreur l'ouverture de la nodelist:",strerror(errno));
return ERROR;
}
strcpy(str,nodel); /*Recherche du numro de version*/
for(i=strlen(str)-1;str[i]!='.' && i>=0;i--);
str[i+4]=0;
sscanf(&(str[i+1]),"%d",&ver);
/*Gnration du nom de la nodelist rduite*/
strcpy(str,nodel);
for(i=strlen(str)-1;str[i]!='\\' && str[i]!='/' && i>=0;i--)
str[i]=0;
sprintf(nnod,"%s%s_%d.%03d",str,region ? "reg" : "zone",region ? region : zone);
umsg("Gnration de la nodelist rduite",nnod);
if((rf=fopen(nnod,"wb"))==NULL) /*Ouverture de la nouvelle nodelist*/
{
umsg("Erreur l'ouverture de la nodelist:",strerror(errno));
return ERROR;
}
/*Analyse de la premire ligne de la nodelist*/
fscanf(nf,";A %s Nodelist",domain); /*Nom du rseau*/
umsg("Rseau:",domain);
/*Gnration de la nouvelle ligne d'en-tte*/
sprintf(domain,"%s_%s_%d",domain,region ? "Region" : "Zone",region ? region : zone);
fgets(str,255,nf);
cpt=strtok(str,":");
sprintf(str2,";A %s Nodelist%s: %u\xD\xA",domain,cpt,12345U);
fputs(str2,rf); /*Ecriture*/
/*Signature du logiciel*/
fprintf(rf,";A Reduced Nodelist generated by InterDiff v1.00\xD\xA");
fprintf(rf,";A (c) 1995, by Nicolas Long at Intermde BBS, 2:323/13.16\xD\xA;\xD\xA",rf);
/*Recherche de la zone traiter dans la nodelist*/
do
{
do
{
ex=fgets(str,255,nf);
}while(str[0]==';' && ex!=0); /*On saute les commentaires*/
cpt=strtok(str,",");
}while(strcmp(cpt,"Zone") || atoi(strtok(NULL,","))!=zone);
str[strlen(str)]=',';
/*Ecriture des nodes indpendants de la zone (jusqu' la premire rgion)*/
do
{
if(str[0]!=';')
str[strlen(str)]=',';
fputs(str,rf);
do
{
ex=fgets(str,255,nf);
}while(str[0]==';' && str[1]>16 && ex!=0);
cpt=strtok(str,",");
}while(strcmp(cpt,"Region") && ex!=0);
/*Si on fait une nodelist de rgion*/
if(region>0)
{
/*Recherche de la rgion*/
do
{
do
{
ex=fgets(str,255,nf);
}while(str[0]==';' && ex!=0);
cpt=strtok(str,",");
}while(strcmp(cpt,"Region") || atoi(strtok(NULL,","))!=region);
str[strlen(str)]=',';
/*Ecriture des nodes de la region*/
do
{
if(str[0]!=';')
str[strlen(str)]=',';
fputs(str,rf);
do
{
ex=fgets(str,255,nf);
}while(str[0]==';' && str[1]>16 && ex!=0);
cpt=strtok(str,",");
}while(strcmp(cpt,"Region") && strcmp(cpt,"Zone") && ex!=0);
}
/*Si on fait une nodelist de zone*/
else
{
/*Ecriture des nodes de la zone*/
do
{
if(str[0]!=';')
str[strlen(str)]=',';
fputs(str,rf);
do
{
ex=fgets(str,255,nf);
}while(str[0]==';' && str[1]>16 && ex!=0);
cpt=strtok(str,",");
}while(strcmp(cpt,"Zone") && ex!=0);
}
c=26; /*On ajoute le EOF*/
fwrite(&c,1,1,rf);
fclose(nf); /*Fermeture des fichiers*/
fclose(rf);
crc16file(nnod); /*Calcul du CRC16*/
/*On crit aprs coup le CRC dans l'en-tte. Pas trs lgant mais bon...*/
rf=fopen(nnod,"ab");
fseek(rf,SEEK_SET,0);
sprintf(&(str2[strlen(str2)-7]),"%05u\xD\xA",fcrc);
fputs(str2,rf);
fclose(rf);
umsg("Nodelist rduite gnre avec succs","");
return(OK);
}
/*Vrif du CRC16*/
int crcheck(char *fname)
{
FILE *nf;
unsigned int crc;
umsg("Vrification du fichier",fname);
if((nf=fopen(fname,"rb"))==NULL) /*Ouverture de la nodelist*/
{
umsg("Erreur l'ouverture de la nodelist:",strerror(errno));
return ERROR;
}
fgets(str,255,nf); /*Lecture de la premire ligne*/
fclose(nf);
crc=atoi(&(str[strlen(str)-7])); /*Recherche du CRC dans la chaine lue*/
crc16file(fname); /*Calcul du CRC*/
/*Comparaison des CRC*/
umsg(crc==fcrc ? "Test CRC Ok" : "Mauvais CRC","");
return(OK);
}
void howto(void)
{
umsg("Mauvais format des paramtres !","(voir INTERDIF.DOC)");
}
/*Affichage de messages*/
void umsg(char *msgh,char *msgt)
{
printf("%s %s\n",msgh,msgt);
fprintf(logf,"%s %s\n",msgh,msgt);
}